package gui.addrecipe;

import javax.swing.JPanel;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import org.jdom.JDOMException;

import start.Config;
import start.Start;
import xml.XMLCategoryReader;

/**
 * Unterpanel von AddRecipe.java.
 * Bietet Formular-Elemente fuer das Hinzufuegen eines Rezepts an
 * @author Dominik Korittki
 */
public class AddRecipe_Basic extends JPanel {
	/**Serial Version ID*/
	private static final long serialVersionUID = 1L;
	/**Textfeld zur Eingabe des Rezeptnamens*/
	private JTextField nameTF;
	/**Textfeld zur Eingabe einer hinzuzufuegenden Zutat (Name)*/
	private JTextField zutatenNameTF;
	/**Textfeld zur Eingabe einer hinzuzufuegenden Zutat (Menge)*/
	private JTextField zutatenMengeTF;
	/**Combobox zur Auswahl einer Einheit fuer eine hinzuzufuegende Zutat*/
	private JComboBox einheitenCMB;
	/**Textfeld zur Eingabe einer eigenen Mengeneinheit fuer Zutaten*/
	private JTextField einheitTF;
	/**ComboBox zur Auswahl einer Kategorie*/
	private JComboBox kategorie1CMB;
	/**ComboBox zur Auswahl einer Kategorie*/
	private JComboBox kategorie2CMB;
	/**ComboBox zur Auswahl einer Kategorie*/
	private JComboBox kategorie3CMB;
	/**ComboBox zur Auswahl einer Kategorie*/
	private JTextArea txtZubereitungArea;
	/**ComboBox zur Auswahl einer Kategorie*/
	private String[] einheiten = { "keine", "eigenes", "ml", "l", "g", "kg", "Pf", "el", "tl", "Prise", "Packung" };
	/**ComboBox zur Auswahl einer Kategorie*/
	private String[] kategorien = null;

	/**
	 * Erstellt das linke Panel des Hinzufuegen-Tabs
	 * @throws IOException Ein- / Ausgabe Ausnahmen 
	 * @throws JDOMException JDOM Ausnahmen
	 */
	public AddRecipe_Basic() throws JDOMException, IOException {
		//Kategorien auslesen
		updateKategorien();
		
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0};
		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);
		
		JPanel panel = new JPanel();
		GridBagConstraints gbc_panel = new GridBagConstraints();
		gbc_panel.fill = GridBagConstraints.BOTH;
		gbc_panel.gridx = 0;
		gbc_panel.gridy = 0;
		add(panel, gbc_panel);
		GridBagLayout gbl_panel = new GridBagLayout();
		gbl_panel.columnWidths = new int[]{0, 0, 0, 0, 100, 0};
		gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0};
		gbl_panel.columnWeights = new double[]{0.0, 0.3, 0.3, 1.0, 2.0, 0.0};
		gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
		panel.setLayout(gbl_panel);
		
		JLabel lblName = new JLabel("Name des Gerichts");
		GridBagConstraints gbc_lblName = new GridBagConstraints();
		gbc_lblName.anchor = GridBagConstraints.EAST;
		gbc_lblName.insets = new Insets(0, 0, 5, 5);
		gbc_lblName.gridx = 0;
		gbc_lblName.gridy = 0;
		panel.add(lblName, gbc_lblName);
		
		nameTF = new JTextField(30);
		nameTF.setDocument(new FixedSizeDocument(Config.getMaxSizeRezeptName()));
		nameTF.setToolTipText("zb. Spagetti Bolognese");
		GridBagConstraints gbc_nameTF = new GridBagConstraints();
		gbc_nameTF.fill = GridBagConstraints.HORIZONTAL;
		gbc_nameTF.gridwidth = 5;
		gbc_nameTF.insets = new Insets(0, 0, 5, 0);
		gbc_nameTF.gridx = 1;
		gbc_nameTF.gridy = 0;
		panel.add(nameTF, gbc_nameTF);
		
		JLabel lblZutaten = new JLabel("Zutaten");
		GridBagConstraints gbc_lblZutaten = new GridBagConstraints();
		gbc_lblZutaten.anchor = GridBagConstraints.EAST;
		gbc_lblZutaten.insets = new Insets(0, 0, 5, 5);
		gbc_lblZutaten.gridx = 0;
		gbc_lblZutaten.gridy = 1;
		panel.add(lblZutaten, gbc_lblZutaten);
		
		zutatenNameTF = new JTextField();
		zutatenNameTF.setDocument(new FixedSizeDocument(Config.getMaxSizeZutatenName()));
		zutatenNameTF.setText("Name");
		zutatenNameTF.setColumns(10);
		zutatenNameTF.setToolTipText("z.B. Nudeln");
		GridBagConstraints gbc_zutatenNameTF = new GridBagConstraints();
		gbc_zutatenNameTF.fill = GridBagConstraints.HORIZONTAL;
		gbc_zutatenNameTF.insets = new Insets(0, 0, 5, 5);
		gbc_zutatenNameTF.gridx = 1;
		gbc_zutatenNameTF.gridy = 1;
		panel.add(zutatenNameTF, gbc_zutatenNameTF);
		
		zutatenMengeTF = new JTextField();
		zutatenMengeTF.setDocument(new FixedSizeDocument(10));
		zutatenMengeTF.setText("Menge");
		zutatenMengeTF.setColumns(10);
		zutatenMengeTF.setToolTipText("z.B. 300");
		GridBagConstraints gbc_zutatenMengeTF = new GridBagConstraints();
		gbc_zutatenMengeTF.fill = GridBagConstraints.HORIZONTAL;
		gbc_zutatenMengeTF.insets = new Insets(0, 0, 5, 5);
		gbc_zutatenMengeTF.gridx = 2;
		gbc_zutatenMengeTF.gridy = 1;
		panel.add(zutatenMengeTF, gbc_zutatenMengeTF);
		
		einheitenCMB = new JComboBox(einheiten);
		einheitenCMB.setToolTipText("Wähle eine Einheit aus wie Gramm, Stück, Teelöffel, etc.");
		einheitenCMB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(einheitenCMB.getSelectedItem().equals("eigenes")) {
					einheitTF.setEnabled(true);
				} else {
					einheitTF.setEnabled(false);
				}
			}
		});
		GridBagConstraints gbc_einheitenCMB = new GridBagConstraints();
		gbc_einheitenCMB.fill = GridBagConstraints.HORIZONTAL;
		gbc_einheitenCMB.insets = new Insets(0, 0, 5, 5);
		gbc_einheitenCMB.gridx = 3;
		gbc_einheitenCMB.gridy = 1;
		panel.add(einheitenCMB, gbc_einheitenCMB);
		
		einheitTF = new JTextField();
		einheitTF.setDocument(new FixedSizeDocument(5));
		einheitTF.setColumns(3);
		einheitTF.setToolTipText("z.B. ml");
		einheitTF.setEnabled(false);
		GridBagConstraints gbc_einheitTF = new GridBagConstraints();
		gbc_einheitTF.fill = GridBagConstraints.HORIZONTAL;
		gbc_einheitTF.insets = new Insets(0, 0, 5, 5);
		gbc_einheitTF.gridx = 4;
		gbc_einheitTF.gridy = 1;
		panel.add(einheitTF, gbc_einheitTF);
		
		ImageIcon iconZutatenPlus = new ImageIcon(Start.getImgs().getMoveForward(), "Zutat zum Rezept hinzufügen");
		JButton buttonZutatenAdd = new JButton(iconZutatenPlus);
		buttonZutatenAdd.setToolTipText("Zur Liste der Zutaten hinzufügen");
		buttonZutatenAdd.addActionListener(new ActionListener() {
			/*
			 * Hinzufügen einer Zutat zur Zutatenliste
			 */
			@Override public void actionPerformed(ActionEvent arg0) {
				System.out.println("DEBUG: Zutat hinzufuegen Button gedrückt!");
				addToIngredients();
			}
		});
		buttonZutatenAdd.addKeyListener(new KeyListener() {
			@Override public void keyTyped(KeyEvent e) {}
			@Override public void keyReleased(KeyEvent e) {}
			@Override public void keyPressed(KeyEvent arg0) {
				if (arg0.getKeyCode() == KeyEvent.VK_ENTER)
					addToIngredients();
			}
		});
		GridBagConstraints gbc_buttonZutatenAdd = new GridBagConstraints();
		gbc_buttonZutatenAdd.insets = new Insets(0, 0, 5, 5);
		gbc_buttonZutatenAdd.gridx = 5;
		gbc_buttonZutatenAdd.gridy = 1;
		panel.add(buttonZutatenAdd, gbc_buttonZutatenAdd);
		
		
		JLabel lblKategorien = new JLabel("Kategorien");
		GridBagConstraints gbc_lblKategorien = new GridBagConstraints();
		gbc_lblKategorien.anchor = GridBagConstraints.EAST;
		gbc_lblKategorien.insets = new Insets(0, 0, 5, 5);
		gbc_lblKategorien.gridx = 0;
		gbc_lblKategorien.gridy = 2;
		panel.add(lblKategorien, gbc_lblKategorien);
		
		kategorie1CMB = new JComboBox(kategorien);
		kategorie1CMB.addItem("keine");
		kategorie1CMB.setSelectedItem("keine");
		kategorie1CMB.setToolTipText("Kategorien ermöglichen ein leichteres Finden des Rezepts");
		GridBagConstraints gbc_kategorie1CMB = new GridBagConstraints();
		gbc_kategorie1CMB.fill = GridBagConstraints.HORIZONTAL;
		gbc_kategorie1CMB.insets = new Insets(0, 0, 5, 5);
		gbc_kategorie1CMB.gridx = 1;
		gbc_kategorie1CMB.gridy = 2;
		gbc_kategorie1CMB.gridwidth = 1;
		panel.add(kategorie1CMB, gbc_kategorie1CMB);
		
		kategorie2CMB = new JComboBox(kategorien);
		kategorie2CMB.addItem("keine");
		kategorie2CMB.setSelectedItem("keine");
		kategorie2CMB.setToolTipText("Kategorien ermöglichen ein leichteres Finden des Rezepts");
		GridBagConstraints gbc_kategorie2CMB = new GridBagConstraints();
		gbc_kategorie2CMB.fill = GridBagConstraints.HORIZONTAL;
		gbc_kategorie2CMB.insets = new Insets(0, 0, 5, 5);
		gbc_kategorie2CMB.gridx = 2;
		gbc_kategorie2CMB.gridy = 2;
		panel.add(kategorie2CMB, gbc_kategorie2CMB);
		
		kategorie3CMB = new JComboBox(kategorien);
		kategorie3CMB.addItem("keine");
		kategorie3CMB.setSelectedItem("keine");
		kategorie3CMB.setToolTipText("Kategorien ermöglichen ein leichteres Finden des Rezepts");
		GridBagConstraints gbc_kategorie3CMB = new GridBagConstraints();
		gbc_kategorie3CMB.gridwidth = 1;
		gbc_kategorie3CMB.fill = GridBagConstraints.HORIZONTAL;
		gbc_kategorie3CMB.insets = new Insets(0, 0, 5, 5);
		gbc_kategorie3CMB.gridx = 3;
		gbc_kategorie3CMB.gridy = 2;
		panel.add(kategorie3CMB, gbc_kategorie3CMB);
		
		JLabel lblZubereitung = new JLabel("Zubereitung");
		GridBagConstraints gbc_lblZubereitung = new GridBagConstraints();
		gbc_lblZubereitung.anchor = GridBagConstraints.NORTHEAST;
		gbc_lblZubereitung.insets = new Insets(0, 0, 0, 5);
		gbc_lblZubereitung.gridx = 0;
		gbc_lblZubereitung.gridy = 3;
		panel.add(lblZubereitung, gbc_lblZubereitung);
		
		txtZubereitungArea = new JTextArea();
		txtZubereitungArea.setDocument(new FixedSizeDocument(Config.getMaxSizeZubereitungsText()));
		txtZubereitungArea.setFont(new Font("Verdana", Font.PLAIN, 11));
		txtZubereitungArea.setLineWrap(true);
		txtZubereitungArea.setWrapStyleWord(true);
		txtZubereitungArea.setText("Schreibe hier rein, wie man das Gericht zubereitet.\n" +
				"Dazu gehört z.B. wie man einzelne Zutaten vorbereitet oder wann die Soße dick genug ist.");
		
		JScrollPane txtZubereitungAreaSP = new JScrollPane(txtZubereitungArea);
		txtZubereitungAreaSP.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		GridBagConstraints gbc_txtZubereitungAreaSP = new GridBagConstraints();
		gbc_txtZubereitungAreaSP.anchor = GridBagConstraints.NORTH;
		gbc_txtZubereitungAreaSP.fill = GridBagConstraints.BOTH;
		gbc_txtZubereitungAreaSP.gridwidth = 5;
		gbc_txtZubereitungAreaSP.gridx = 1;
		gbc_txtZubereitungAreaSP.gridy = 3;
		panel.add(txtZubereitungAreaSP, gbc_txtZubereitungAreaSP);
	}
	
	/**
	 * Zuruecksetzen der Textinformationen in Textfeldern, Areas, Comboboxen, etc.
	 */
	public void reset() {
		nameTF.setText("");
		zutatenNameTF.setText("Name");
		zutatenMengeTF.setText("Menge");
		einheitenCMB.setSelectedIndex(0);
		kategorie1CMB.setSelectedItem("keine");
		kategorie2CMB.setSelectedItem("keine");
		kategorie3CMB.setSelectedItem("keine");
		txtZubereitungArea.setText("");
	}
	
	/** Getter Methode fuer den Inhalt des Namen Textfeldes */
	public String getName() {
		return nameTF.getText();
	}
	
	/** Getter Methode fuer die ausgewaehlte Kategorie #1 */
	public String getKategorie1() {
		return (String) kategorie1CMB.getSelectedItem();
	}
	
	/** Getter Methode fuer die ausgewaehlte Kategorie #2 */
	public String getKategorie2() {
		return (String) kategorie2CMB.getSelectedItem();
	}
	
	/** Getter Methode fuer die ausgewaehlte Kategorie #3 */
	public String getKategorie3() {
		return (String) kategorie3CMB.getSelectedItem();
	}
	
	/** Getter Methode fuer den Text im Textfeld fuer die Zubereitung */
	public String getZubereitung() {
		return txtZubereitungArea.getText();
	}
	
	/** Getter Methode fuer das Namenstextfeld */
	public JTextField getNameTF() {
		return nameTF;
	}

	/** Setter Methode fuer das Namenstextfeld */
	public void setNameTF(JTextField nameTF) {
		this.nameTF = nameTF;
	}

	/** Getter Methode fuer die Zutat-Einheiten Combobox */
	public JComboBox getEinheitenCMB() {
		return einheitenCMB;
	}

	/** Setter Methode fuer die Zutat-Einheiten Combobox */
	public void setEinheitenCMB(JComboBox einheitenCMB) {
		this.einheitenCMB = einheitenCMB;
	}

	/** Getter Methode fuer eine Kategorie */
	public JComboBox getKategorie1CMB() {
		return kategorie1CMB;
	}

	/** Setter Methode fuer eine Kategorie */
	public void setKategorie1CMB(JComboBox kategorie1cmb) {
		kategorie1CMB = kategorie1cmb;
	}

	/** Getter Methode fuer eine Kategorie */
	public JComboBox getKategorie2CMB() {
		return kategorie2CMB;
	}

	/** Setter Methode fuer eine Kategorie */
	public void setKategorie2CMB(JComboBox kategorie2cmb) {
		kategorie2CMB = kategorie2cmb;
	}

	/** Getter Methode fuer eine Kategorie */
	public JComboBox getKategorie3CMB() {
		return kategorie3CMB;
	}

	/** Setter Methode fuer eine Kategorie */
	public void setKategorie3CMB(JComboBox kategorie3cmb) {
		kategorie3CMB = kategorie3cmb;
	}

	/** Getter Methode fuer die Zubereitungstextarea */
	public JTextArea getTxtZubereitungArea() {
		return txtZubereitungArea;
	}

	/** Setter Methode fuer ie Zubereitungstextarea */
	public void setTxtZubereitungArea(JTextArea txtZubereitungArea) {
		this.txtZubereitungArea = txtZubereitungArea;
	}

	/**
	 * Laedt alle Kategorien aus der XML und stellt sie im Interface zur Verfuegung
	 * @throws JDOMException XML Fehler
	 * @throws IOException Eingabe Ausgabe Fehler
	 */
	public void updateKategorien() throws JDOMException, IOException {
		if(Config.debugMode()) System.out.println("Kategorien updaten");
		XMLCategoryReader catreader = new XMLCategoryReader(Start.getKategoriexml());
		
		kategorien = catreader.convertToStringArray();
		if(kategorie1CMB != null) {
			kategorie1CMB.removeAllItems();
			kategorie1CMB.setModel(new DefaultComboBoxModel(kategorien));
			kategorie1CMB.addItem("keine");
			kategorie1CMB.setSelectedItem("keine");
		}
		if(kategorie2CMB != null) {
			kategorie2CMB.removeAllItems();
			kategorie2CMB.setModel(new DefaultComboBoxModel(kategorien));
			kategorie2CMB.addItem("keine");
			kategorie2CMB.setSelectedItem("keine");
			
		}
		if(kategorie3CMB != null) {
			kategorie3CMB.removeAllItems();
			kategorie3CMB.setModel(new DefaultComboBoxModel(kategorien));
			kategorie3CMB.addItem("keine");
			kategorie3CMB.setSelectedItem("keine");
		}
	}
	
	/**
	 * Speichert eine Zutat in der temporaeren ZutatenListe
	 */
	private void addToIngredients() {
		if(zutatenNameTF.getText().isEmpty() || zutatenMengeTF.getText().isEmpty()) {
			System.out.println("DEBUG: Situation 1");
			JOptionPane.showMessageDialog(Start.getDefWindow(),
				    "In den Feldern \"Name\" und \"Menge\" müssen Informationen stehen",
				    "Fehler", JOptionPane.ERROR_MESSAGE);
		} else {
			System.out.println("DEBUG: Situation 2");
			String output = zutatenMengeTF.getText();
			if(((String) einheitenCMB.getSelectedItem()).compareTo("keine") != 0 &&
					((String) einheitenCMB.getSelectedItem()).compareTo("eigenes") != 0) {
				System.out.println("DEBUG: Situation 3");
				output += ((String) einheitenCMB.getSelectedItem());
			} else if(((String) einheitenCMB.getSelectedItem()).compareTo("eigenes") == 0) {
				System.out.println("DEBUG: Situation 4");
				output += einheitTF.getText();
			}
			output += " " + zutatenNameTF.getText();
			((AddRecipe) getParent()).getRightTopPanel().addListObject(output);
		}
	}

}